package com.gqr.singleton;

/**
 * Copyright (C), 2020-2024,gqr
 * FileName:Singleton3
 * author:guqingrong
 * Date:2024-05-02 21:48
 * Description: 双重检查(推荐面试使用)
 * History:
 * <author>    <time>    <version>    <desc>
 * 作者姓名     修改时间     版本号        描述
 */
public class Singleton6 {
    /**
     * 加volatile的必要
     * 新建对象不是原子操作 实际上有三个步骤
     */
    private volatile static Singleton6 instance;

    private Singleton6() {

    }

    /**
     * 双重检查
     * 优点: 线程安全,延迟加载,效率高
     * 为什么要双重检查
     */

    public static Singleton6 getInstance() {

        if (instance == null) {
            /**
             * 该同步代码块并没有达到线程安全
             * 两个线程进入到这里面 会创建出来两个实例的
             */
            synchronized (Singleton6.class) {
                /**
                 * 再一次检查
                 */
                if (instance == null) {
                    instance = new Singleton6();

                }
            }
        }
        return instance;
    }
}
